// 请求工具类
import axios from 'axios'
import store from '@/store'
import router from '@/router'
// 下载引入插件
import to from 'await-to-js'
import { refreshTokenAPI } from '@/api/user'

// 导出baseURL
export const baseURL = 'http://geek.itheima.net/'
// 1.创建新的axios实例
const instance = axios.create({
  baseURL,
  timeout: 5000
})

// 3.请求头带token--请求拦截器
instance.interceptors.request.use(config => {
  const token = store.state.user.token
  // console.log(token)
  if (token) config.headers.Authorization = `Bearer ${token}`
  return config
}, err => Promise.reject(err)
)
// 4.token失效处理--响应拦截器
instance.interceptors.response.use(res => res, async err => {
  // 判断状态码为401
  // 删除token
  // 跳转登陆,当前路由的完整地址需要传递给登陆页面: 将来登陆完成后需要跳转回去
  if (err.response && err.response.status === 401) {
    // ★1. 使用refresh_token更新token不能使用instance，请求拦截器中会覆盖请求头
    const [err2, res] = await to(refreshTokenAPI(store.state.user.refreshToken))
    // ★2. 刷新token失败
    if (err2) {
      store.commit('user/setToken', '')
      router.push('/login?returnUrl=' + encodeURIComponent(router.currentRoute.fullPath))
    } else {
      // ★3. 刷新token成功
      store.commit('user/setToken', res.data.data.token)
      return instance(err.config)
    }
    // 组件：this.$route.path 路径  fullPath 完整路径，带参数的
    // 通过 router实例 获取当前路由信息对象 currentRoute
    // 回跳地址：/order?id=100&name=tom  ===> 跳转登录地址  /login?returnUrl=/order?id=100&name=tom
    // 地址可能回出现特殊字符 & 需要转换成url编码 encodeURIComponent
    //  /login?returnUrl=%2Forder%3Fid%3D100%26name%3Dtom
    router.push('/login?returnUrl=' + encodeURIComponent(router.currentRoute.fullPath))
  }
  return Promise.reject(err)
})
// 2.导出一个通过axios实例调用接口的函数
export default ({ url, method = 'get', params, data, headers }) => {
  const promise = instance({ url, method, params, data, headers })
  // 用to把promise对象包裹起来
  return to(promise)
}
